جزوه · فصل نهم · جلسه ۹۰ · استفاده از حلقه‌ها (for) ← بازگشت به فهرست
📘 فصل نهم · جلسه ۹۰ استفاده از حلقه‌ها (for)
📅 تاریخ: پنجشنبه، ۴ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
این جلسه یکی از مباحث بسیار مهم در اسکریپت‌نویسی است. حلقه‌های for برای اجرای تکراری دستورات استفاده می‌شوند و در آزمون‌های LPIC و RHCSA بسیار پرتکرارند.
🔄 قبل از شروع، یه مثال ساده:

فرض کن می‌خوای ۵ بار به کسی «سلام» بگی. به‌جای اینکه ۵ بار دستور echo رو تایپ کنی، می‌تونی با یه حلقه این کار رو اتوماتیک کنی. توی لینوکس، حلقه‌های for دقیقاً همین کار رو انجام می‌دن: به اسکریپت شما اجازه می‌دن یه کار رو تعداد مشخصی بار تکرار کنی. این جلسه بهت یاد میده چطور با for، seq و ترکیب‌های مختلف، کارهای تکراری رو خودکار کنی!

▍ چرا از حلقه‌ها استفاده می‌کنیم؟

در اسکریپت‌نویسی، خیلی مواقع نیاز داریم که یک دستور یا مجموعه‌ای از دستورات را تعداد مشخصی بار اجرا کنیم. مثلاً:

🔑 نکته کلیدی: حلقه‌ها به ما کمک می‌کنند تا کد تکراری ننویسیم و خودکارسازی را به بهترین شکل انجام دهیم.

▍ دستور seq (تولید اعداد متوالی)

seq یک دستور بسیار مفید است که اعداد متوالی را تولید می‌کند. این دستور معمولاً در حلقه‌های for برای تعیین تعداد دفعات تکرار استفاده می‌شود.

• نحوه استفاده از seq

فرمت معنی مثال
seq N اعداد از ۱ تا N seq 5 → 1 2 3 4 5
seq start end اعداد از start تا end seq 10 15 → 10 11 12 13 14 15
seq start step end اعداد از start تا end با گام step seq 1 2 10 → 1 3 5 7 9

• مثال‌های عملی

┌──(ya3in㉿kali)-[~] └─$ seq 5 1 2 3 4 5 └─$ seq 10 15 10 11 12 13 14 15 └─$ seq 1 2 10 1 3 5 7 9

توضیح: seq اعداد را به صورت عمودی (هر عدد در یک خط) چاپ می‌کند. در حلقه‌های for از آن برای تولید لیست اعداد استفاده می‌کنیم.

▍ ساختار حلقه for

for متغیر in مقدار۱ مقدار۲ مقدار۳ ... do دستورات (با استفاده از $متغیر) done

نکات مهم:

▍ مثال‌های پایه حلقه for

• مثال ۱: چاپ اعداد ۱ تا ۵

#!/bin/bash # حلقه for با لیست ثابت for i in 1 2 3 4 5 do echo "Welcome $i times" done
┌──(ya3in㉿kali)-[~] └─$ ./for1.sh Welcome 1 times Welcome 2 times Welcome 3 times Welcome 4 times Welcome 5 times

توضیح: متغیر i به ترتیب مقادیر ۱ تا ۵ را می‌گیرد و هر بار پیام چاپ می‌شود.

• مثال ۲: استفاده از seq در حلقه

#!/bin/bash # حلقه for با seq for i in $(seq 1 2 10) do echo "Number: $i" done
┌──(ya3in㉿kali)-[~] └─$ ./for2.sh Number: 1 Number: 3 Number: 5 Number: 7 Number: 9

توضیح: seq 1 2 10 اعداد فرد ۱ تا ۹ را تولید می‌کند و حلقه روی آنها می‌چرخد.

نکته: $(seq ...) یعنی خروجی seq را به عنوان لیست به حلقه بده. این یک روش بسیار رایج است.

• مثال ۳: پینگ کردن چندین آی‌پی

#!/bin/bash # پینگ کردن آی‌پی‌های ۱ تا ۵ for i in $(seq 1 5) do ping -c 1 192.168.1.$i done

این اسکریپت آی‌پی‌های 192.168.1.1 تا 192.168.1.5 را پینگ می‌کند.

نکته: ترکیب for و seq برای پینگ کردن محدوده‌های آی‌پی بسیار کاربردی است.

▍ مثال‌های پیشرفته‌تر

• مثال ۴: کپی کردن چندین فایل

#!/bin/bash # کپی کردن چندین فایل به /tmp for file in /etc/passwd /etc/group /etc/hosts do cp $file /tmp/ echo "Copied $file to /tmp" done
┌──(ya3in㉿kali)-[~] └─$ ./for3.sh Copied /etc/passwd to /tmp Copied /etc/group to /tmp Copied /etc/hosts to /tmp

توضیح: حلقه روی لیست فایل‌ها می‌چرخد و هر کدام را به /tmp کپی می‌کند.

• مثال ۵: اسکن پورت با for و timeout

#!/bin/bash # اسکن پورت با حلقه for read -p "Enter target IP: " TARGET for PORT in 22 80 443 3306 8080 do timeout 1 bash -c "echo > /dev/tcp/$TARGET/$PORT" 2>/dev/null if [ $? -eq 0 ]; then echo "Port $PORT OPEN" else echo "Port $PORT CLOSED" fi done
┌──(ya3in㉿kali)-[~] └─$ ./port_scanner.sh Enter target IP: 192.168.1.1 Port 22 OPEN Port 80 OPEN Port 443 CLOSED Port 3306 CLOSED Port 8080 OPEN

توضیح: این اسکریپت یک اسکنر پورت ساده است که پورت‌های مشخص را روی یک آی‌پی هدف بررسی می‌کند.

نکته: timeout 1 یعنی حداکثر ۱ ثانیه صبر کن. /dev/tcp/ یک روش داخلی Bash برای اتصال به پورت‌هاست.

▍ بررسی دستور for i in 1 2; do ping -c 1 192.168.1.$i; done;

🔍 تحلیل دستور درخواستی شما:

دستور for i in 1 2; do ping -c 1 192.168.1.$i; done; را تکه‌تکه بررسی می‌کنیم:

بخش معنی
for i in 1 2 متغیر i به ترتیب مقادیر ۱ و ۲ را می‌گیرد.
do شروع بدنهٔ حلقه.
ping -c 1 192.168.1.$i آی‌پی 192.168.1.1 و سپس 192.168.1.2 را پینگ می‌کند.
done پایان حلقه.

این دستور معادل اجرای دو دستور زیر است:

ping -c 1 192.168.1.1 ping -c 1 192.168.1.2
💡 نکته: این روش برای اسکن سریع چند آی‌پی در شبکه بسیار مفید است. می‌توانید با seq محدوده را گسترش دهید:
for i in $(seq 1 10); do ping -c 1 192.168.1.$i; done

▍ روش‌های مختلف ایجاد لیست در for

روش مثال توضیح
لیست ثابت for i in 1 2 3 4 5 مقادیر را مستقیماً می‌نویسیم.
seq for i in $(seq 1 10) تولید اعداد متوالی با seq.
Brace Expansion for i in {1..10} روش کوتاه‌تر (مشابه seq).
خروجی فرمان for file in $(ls *.txt) لیست فایل‌های txt.
آرایه for i in "${array[@]}" حلقه روی آرایه.

▍ جمع‌بندی و نکات مهم

✅ جمع‌بندی نهایی:
  • for → حلقه برای تکرار دستورات با مقادیر مختلف.
  • seq → تولید اعداد متوالی برای استفاده در حلقه.
  • ساختار: for var in list; do commands; done
  • لیست: می‌تواند ثابت، seq، {1..10} یا خروجی فرمان باشد.
  • $var → دسترسی به مقدار فعلی متغیر حلقه.
  • کاربرد: پینگ، کپی فایل، اسکن پورت، ایجاد کاربر و ...
  • ترکیب با if: می‌توانید در بدنه حلقه از if هم استفاده کنید.
📝 تمرین پیشنهادی:

یک اسکریپت بنویسید که:

  • با read از کاربر یک عدد N بگیرد.
  • با for و seq اعداد ۱ تا N را چاپ کند.
  • فقط اعداد زوج را چاپ کند (با if و %).
  • در پایان مجموع اعداد زوج را چاپ کند.